#pragma once
#include <sys/epoll.h>
#include <vector>
#include <unordered_map>

#define MAX_EPOLLEVENTS 1024

class Channel;
class Poller
{
private:
    int _epfd;                                    // epoll句柄文件描述符
    struct epoll_event _evs[MAX_EPOLLEVENTS];     // 存储从 epoll_wait 返回的就绪事件 的结构体数组
    std::unordered_map<int, Channel *> _channels; // 文件描述符和其对应的channel对象的关联关系
private:
    // 1. 更新Channel，就是调用epoll_ctl add/mod/del
    void Updata(Channel *channel, int op);

    // 2. 判断一个Channel是否已经添加了事件监控
    bool HasChannel(Channel *channel);

public:
    Poller();

    // 1. 添加修改事件监控
    void UpdataEvent(Channel *channel);

    // 2. 移除事件监控
    void RemoveEvent(Channel *channel);

    // 3. 开始监控，返回活跃连接
    void Poll(std::vector<Channel *> *active);
};